#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import datetime
from thdata.models import *
import pymysql


def get_status(one_data):
    '''
    传入一条记录的对象，返回其工作状态
    :param one_data:
    :return:
    '''
    status = 1  # 默认正常
    if one_data.green == '1' and one_data.yellow == '0' and one_data.red == '0':
        status = 1
    elif (one_data.red == '1' and one_data.yellow == '0' and one_data.green == '0') or (
                        one_data.green == '1' and one_data.red == '1' and one_data.yellow == '0'):
        status = 2
    elif (one_data.yellow == '1' and one_data.red == '0' and one_data.green == '0') or (
                        one_data.yellow == '1' and one_data.red == '0' and one_data.green == '1') or (
                        one_data.yellow == '1' and one_data.red == '1' and one_data.green == '0'):
        status = 3
    elif (one_data.yellow == '0' and one_data.red == '0' and one_data.green == '0'):
        status = 4
    return status




def new_five_minitues_status(start, end, gw_id):
    '''
    计算一个设备编号在一段时间内的状态
    该状态分为正常，异常，待机，停机，未知。
    在一段时间内，谁占有的时间最多，则确定概设备的状态
    :param start: 开始时间（datetime）
    :param end: 结束时间（datetime）
    :param controller: 设备编号
    :return:
    '''
    # 第一次循環看是不是只有一筆數據，如果是直接用結束時間減去時間，如果不是取得第一筆時間的狀態，然後進入第二層循環
    #然後用第二次的時間減去第一次的時間，根據狀態累計時間判斷這5分鐘是那種狀態
    data = list(TbTempMachineState.objects.filter(gw_id=gw_id, rc__gte=start, rc__lte=end).order_by('rc'))
    nomal = datetime.timedelta()  # 正常工作时间
    exception = datetime.timedelta()  # 异常工作时间
    standby = datetime.timedelta()  # 待机时间
    stop = datetime.timedelta()  # 停机时间
    status = 1  # 1为正常，2为异常，3为待机，4为停机 5为未知情况，通常是没有数据的时候
    if len(data) == 0:
        return 5,[0,0,0,0,300]
    for one_data in data:
        if data.index(one_data) == 0:  # 第一次循环
            status = get_status(one_data)
            if len(data) == 1:
                if status == 1:
                    nomal += end - one_data.rc
                elif status == 2:
                    exception += end - one_data.rc
                elif status == 3:
                    standby += end - one_data.rc
                elif status == 4:
                    stop += end - one_data.rc
            continue

        if status == 1:
            nomal += one_data.rc - data[data.index(one_data) - 1].rc
        elif status == 2:
            exception += one_data.rc - data[data.index(one_data) - 1].rc
        elif status == 3:
            standby += one_data.rc - data[data.index(one_data) - 1].rc
        elif status == 4:
            stop += one_data.rc - data[data.index(one_data) - 1].rc
        status = get_status(one_data)
        if data.index(one_data) == len(data) - 1:  # 最后一次循环
            if status == 1:
                nomal += end - one_data.rc

            elif status == 2:
                exception += end - one_data.rc
            elif status == 3:
                standby += end - one_data.rc
            elif status == 4:
                stop += end - one_data.rc

    first_one = TbTempMachineState.objects.filter(gw_id=gw_id, rc__gte=start).order_by('rc').first()
    one_status = get_status(first_one)

    if one_status == 1:
        nomal += data[0].rc - start
    elif status == 2:
        exception += data[0].rc - start
    elif status == 3:
        standby += data[0].rc - start
    elif status == 4:
        stop += data[0].rc - start
    l = [nomal, exception, standby, stop]
    if nomal == max(l):
        return 1,l
    elif exception == max(l):
        return 2,l
    elif standby == max(l):
        return 3,l
    elif stop == max(l):
        return 4,l


def five_minitues_status(start, end, controller):
    '''
    计算一个设备编号在一段时间内的状态
    该状态分为正常，异常，待机，停机，未知。
    在一段时间内，谁占有的时间最多，则确定概设备的状态
    :param start: 开始时间（datetime）
    :param end: 结束时间（datetime）
    :param controller: 设备编号
    :return:
    '''
    # 第一次循環看是不是只有一筆數據，如果是直接用結束時間減去時間，如果不是取得第一筆時間的狀態，然後進入第二層循環
    #然後用第二次的時間減去第一次的時間，根據狀態累計時間判斷這5分鐘是那種狀態
    data = list(TbFirstRunning.objects.filter(controller=controller, in_time__gte=start, in_time__lte=end))
    nomal = datetime.timedelta()  # 正常工作时间
    exception = datetime.timedelta()  # 异常工作时间
    standby = datetime.timedelta()  # 待机时间
    stop = datetime.timedelta()  # 停机时间
    status = 1  # 1为正常，2为异常，3为待机，4为停机 5为未知情况，通常是没有数据的时候
    if len(data) == 0:
        return 5
    for one_data in data:
        if data.index(one_data) == 0:  # 第一次循环
            status = get_status(one_data)
            if len(data) == 1:
                if status == 1:
                    nomal += end - one_data.in_time
                elif status == 2:
                    exception += end - one_data.in_time
                elif status == 3:
                    standby += end - one_data.in_time
                elif status == 4:
                    stop += end - one_data.in_time
            continue

        if status == 1:
            nomal += one_data.in_time - data[data.index(one_data) - 1].in_time
        elif status == 2:
            exception += one_data.in_time - data[data.index(one_data) - 1].in_time
        elif status == 3:
            standby += one_data.in_time - data[data.index(one_data) - 1].in_time
        elif status == 4:
            stop += one_data.in_time - data[data.index(one_data) - 1].in_time
        status = get_status(one_data)

        if data.index(one_data) == len(data) - 1:  # 最后一次循环
            if status == 1:
                nomal += end - one_data.in_time
            elif status == 2:
                exception += end - one_data.in_time
            elif status == 3:
                standby += end - one_data.in_time
            elif status == 4:
                stop += end - one_data.in_time
    first_one = TbFirstRunning.objects.filter(controller=controller, in_time__lte=start).order_by('-in_time').first()
    one_status = get_status(first_one)
    if one_status == 1:
        nomal += data[0].in_time - start
    elif status == 2:
        exception += data[0].in_time - start
    elif status == 3:
        standby += data[0].in_time - start
    elif status == 4:
        stop += data[0].in_time - start
    l = [nomal, exception, standby, stop]
    if nomal == max(l):
        return 1
    elif exception == max(l):
        return 2
    elif standby == max(l):
        return 3
    elif stop == max(l):
        return 4


def gettime(gw_date,flag):
    """
    處理時間戳的年月日
    :param date:
    :return:
     """
    try:
        if gw_date and flag == 'hour':
            gw_date= (gw_date+datetime.timedelta(minutes=30)).strftime("%Y-%m-%d %H:%M:%S")
            return gw_date[11:16]
        elif gw_date and flag == 'day':
            return gw_date[5:10]
        else:
            return gw_date
    except Exception as e:
        # print(11111111)
        print(str(e))

